package com.lifang.framework.beans.factory.support;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class ConstructorArgumentValues {

    private final List<ConstructorValueHolder> genericArgumentValues = new ArrayList<>();

    private final Map<Integer, ConstructorValueHolder> indexedArgumentValues = new LinkedHashMap<>();

    public boolean isEmpty() {
        return this.genericArgumentValues.isEmpty() && this.indexedArgumentValues.isEmpty();
    }

    public void addConstructorValue(String name, Object value) {
        ConstructorValueHolder constructorValueHolder = new ConstructorValueHolder(name, value);
        this.genericArgumentValues.remove(constructorValueHolder);
        this.genericArgumentValues.add(constructorValueHolder);
    }

    public void addConstructorValue(Class<?> type, Object value) {
        ConstructorValueHolder constructorValueHolder = new ConstructorValueHolder(type, value);
        int size = this.indexedArgumentValues.size();
        indexedArgumentValues.put(++size, constructorValueHolder);
    }

    public int getConstructorValueSize() {
        return Math.max(this.genericArgumentValues.size(), this.indexedArgumentValues.size());
    }

    public Object getConstructorValue(int index, Class<?> type) {
        ConstructorValueHolder valueHolder = indexedArgumentValues.get(index + 1);
        if (valueHolder != null && valueHolder.getType().isAssignableFrom(type)) {
            return valueHolder.getValue();
        }
        return null;
    }
}
